library(tidyverse)
library(lubridate)
library(DT)
library(ggplot2)
library(plotly)
kko <- readLines("text_data.txt")
raw_df <- kko
# comma가 있는 것만 찾기
comma_index <- raw_df %>%
str_detect(",")
# comma가 있는 것만 재정렬
raw_df <- raw_df[comma_index]
## 날짜 데이터
# 첫번째 comma 위치 찾는 함수
index_data <- regexpr(",", raw_df)
# comma 별 글자선택
kakao_date <- str_sub(raw_df,1,index_data - 1)
## user_name 테스트 선정
nchar_max <- max(nchar(raw_df))
# raw_df[which(nchar(raw_df) == 269)]
kakao_text <- str_sub(raw_df, index_data + 2, nchar_max)
# : 있는것
text_colon_index <- grepl(":",kakao_text)
kakao_colon_text <- kakao_text[text_colon_index]
# 첫번재 콜론 위치찾는 함수
first_colon_index <- regexpr(":", kakao_colon_text)
# user_name 찾기
kakao_user_name <- str_sub(kakao_colon_text, 1, first_colon_index-2)
# message 찾기
kakao_message <- str_sub(kakao_colon_text, first_colon_index+2, nchar_max)
# : 없는것
text_not_colon_index <- !text_colon_index
kakao_not_colon_text <- kakao_text[text_not_colon_index]
# User_name_index 데이터프레임 만들기
kakao_colon_df <- data.frame("Username"= kakao_user_name, "Message" = kakao_message, "Index" = which(text_colon_index))
kakao_not_colon_df <- data.frame("Username"= "Unknown","Message" = kakao_not_colon_text, "Index" = which(text_not_colon_index))
# index 정렬
kakao_user_message <- rbind(kakao_colon_df,kakao_not_colon_df) %>%
arrange(Index)
# 날짜 포함 정렬
kakao_df <- cbind("Date" = kakao_date, kakao_user_message)
# 날짜데이터를 위한 전처리
kakao_df$Date <- kakao_df$Date %>%
str_replace_all("\\.","-") %>%
str_remove_all(" ") %>%
str_replace_all("-오전"," ")
# 오후 Index만 따로 추출
pm_Index <- kakao_df$Date %>%
str_detect("-오후") %>%
which()
# 오후 데이터 전처리
kakao_df$Date <- kakao_df$Date %>%
str_replace_all("-오후"," ")
# 날짜 데이터 변형
kakao_df$Date <- kakao_df$Date %>%
ymd_hm()
# 오후 데이터 맞추기 (12시간을 더한다)
hour(kakao_df$Date[pm_Index]) <- hour(kakao_df$Date[pm_Index]) + 12
# NA제거
kakao_df <- kakao_df %>% na.omit()
# User name 바꿔주기
levels(kakao_df$Username)[1:3] <- paste0("User",c(1:length(levels(kakao_df$Username)[1:3])))
kakao_df <- kakao_df[,-4]
하루에 몇 개의 카톡이 오고갔는지 알아보려고 한다. 3명이 있는 카톡대화방이라 많은 대화가 오가지는 않지만 언제 대화가 오고갔는지 파악해보고자 한다.
group_by_rawdata <- kakao_df %>%
mutate(day = ymd(str_sub(kakao_df$Date,1,10))) %>%
group_by(day) %>%
summarise(count = n())
plotly_df <- group_by_rawdata %>%
ggplot(aes(x=day, y= count)) +
geom_line(stat = "identity") +
geom_point(stat = "identity") +
theme_bw()
maxday_index <- which(group_by_rawdata$count == max(group_by_rawdata$count))
평소 카톡 트래픽 발생량은 대부분 비슷한 편이다. 그래프를 보면 특정일(2019-11-13 (1065 건))기준으로 유독 많은 대화가 오고간 것을 확인할 수 있는데, 이 날은 친구들과 캠핑계획을 이야기하던 날이다. 캠핑에 필요한 자재들, 음식, 교통 편 등 전반적인 계획을 세우느라 많은 대화가 오고갔었다.
group_by_rawdata %>%
arrange(desc(count)) %>%
datatable()
카톡 일별 시각화를 해보자. ggplotly 함수를 통해서 반응형 시각화 자료를 만들 수 있다.
ggplotly(plotly_df, height = 500, width = 800)
요일별로 얼마나 많은 대화가 오고갔는지 알아보자.
group_by_rawdata <- kakao_df %>%
mutate(wday = wday(str_sub(kakao_df$Date,1,10),TRUE)) %>%
group_by(wday) %>%
summarise(count = n())
plotly_df <- group_by_rawdata %>%
ggplot(aes(x=wday, y= count)) +
geom_col(stat = "identity") +
theme_bw()
maxday_index <- which(group_by_rawdata$count == max(group_by_rawdata$count))
어느 요일에 제일 많은 대화가 오고갔는지 파악해보려고 했으나, 특별한 패턴은 발견할 수 없었다.
group_by_rawdata %>%
arrange(desc(count)) %>%
datatable()
카톡 일별 시각화를 해보자. ggplotly 함수를 통해서 반응형 시각화 자료를 만들 수 있다.
ggplotly(plotly_df, height = 500, width = 800)
User1이 4228 건으로 제일 많이 카톡을 보냈음을 확인할 수 있다. 그 뒤로 User3, User2 순으로 대화량이 많지만, 특정 유저가 특별히 많은 대화를 하지는 않았고, 유저들 간의 대화량이 대체적으로 비슷한 수준임을 알 수 있다.
kakao_df %>%
group_by(Username) %>%
summarise(User = n()) %>%
datatable()